<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.5.1.min.js"></script>

</head>

<body>
    <!-- HTML结构 -->
    <form id="test-form" action="test">
        <legend>请选择想要学习的编程语言：</legend>
        <fieldset>
            <p><label class="selectAll"><input type="checkbox"> <span class="selectAll">全选</span><span
                        class="deselectAll">全不选</span></label> <a href="#0" class="invertSelect">反选</a></p>
            <p><label><input type="checkbox" name="lang" value="javascript"> JavaScript</label></p>
            <p><label><input type="checkbox" name="lang" value="python"> Python</label></p>
            <p><label><input type="checkbox" name="lang" value="ruby"> Ruby</label></p>
            <p><label><input type="checkbox" name="lang" value="haskell"> Haskell</label></p>
            <p><label><input type="checkbox" name="lang" value="scheme"> Scheme</label></p>
            <p><button type="submit">Submit</button></p>
        </fieldset>
    </form>
</body>
<script>
    'use strict';

    var
        form = $('#test-form'),
        langs = form.find('[name=lang]'),
        selectAll = form.find('label.selectAll :checkbox'),
        selectAllLabel = form.find('label.selectAll span.selectAll'),
        deselectAllLabel = form.find('label.selectAll span.deselectAll'),
        invertSelect = form.find('a.invertSelect');

    // 重置初始化状态:
    form.find('*').show().off();
    form.find(':checkbox').prop('checked', false).off();
    deselectAllLabel.hide();
    // 拦截form提交事件:
    form.off().submit(function (e) {
        e.preventDefault();
        alert(form.serialize());
    });
    // TODO:绑定事件
    // 1. 当用户勾上“全选”时，自动选中所有语言，并把“全选”变成“全不选”
    // 2. 当用户去掉“全不选”时，自动不选中所有语言
    // 获取全选、全不选勾选框的状态
    selectAll.change(function () {
        // 如果是已勾选
        if (this.checked) {
            // 选中所有语言
            langs.prop('checked', true);
            // 将“全选”隐藏
            selectAllLabel.hide();
            // 将“全不选”显示
            deselectAllLabel.show();
        } else {
            // 取消选中所有语言
            langs.prop('checked', false);
            // 将“全选”显示
            selectAllLabel.show();
            // 将“全不选”隐藏
            deselectAllLabel.hide();
        }
    });
    // 3. 当用户点击“反选”时，自动把所有语言状态反转（选中的变为未选，未选的变为选中）
    invertSelect.click(function () {
        // 遍历所有语言
        langs.each(function () {
            // 判断是否是选中状态，如果是选中状态
            if (this.checked) {
                // 将选中的状态改为未选中
                $(this).prop('checked', false);
            } else {
                // 将未选中的改为选中
                $(this).prop('checked', true);
            }
        });
    });
    if (selectAll.checked = true) {
        selectAll.prop('checked', false);
        selectAllLabel.show();
        deselectAllLabel.hide();
    }
    if (langs.not(':checked').length == 5) {
        selectAll.prop('checked', false);
        selectAllLabel.hide();
        deselectAllLabel.show();
    }
    //遍历所有语言
    langs.each(functiion(){
        //判断是否是选中状态，如果是选中状态
        if(this.checked){
        //将选中的状态改为未选中
        $(this).prop('checked', false);
    }
            else {
            //将未选中的改为选中
            $(this).prop('checked', true);
        }
    });
    // 4. 当用户把所有语言都手动勾上时，“全选”被自动勾上，并变为“全不选”
    // 5. 当用户手动去掉选中至少一种语言时，“全不选”自动被去掉选中，并变为“全选”
    // 获取所有语言的总个数
    var long = langs.length;
    // 设置初始勾选了0个
    var count = 0;
    // 点击勾选框
    langs.click(function () {
        count = 0;
        // 遍历每一个语言
        langs.each(function () {
            // 如果勾选上了
            if (this.checked) {
                // 勾选个数自增
                count++;
            }
        });
        // 如果总个数等于勾选的个数
        if (long == count) {
            // 将全选框勾选上
            selectAll.prop('checked', true);
            // “全选”隐藏
            selectAllLabel.hide();
            // “全不选”显示
            deselectAllLabel.show();
        } else {
            // 全选框取消勾引
            selectAll.prop('checked', false);
            // “全选”显示
            selectAllLabel.show();
            // “全不选”隐藏
            deselectAllLabel.hide();
        }
    });

    // 测试:
    console.log('请测试功能是否正常。');
</script>

</html>